#include "common.h"

#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tests/common_test.h"
#include "util/log.h"
#include <SDL2/SDL.h>

// 下面的宏定义中，#x 中间有没有空格都是可以的
#define LOG1(x) do { printf("%s=%d\n",# x,x); }while(0)

// ##：用于将带参数的宏定义中将两个子串(token)联接起来，从而形成一个新的子串；但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元；
#define LOG2(x) log##x()

// __VA_ARGS__:用于在宏替换部分中，表示可变参数列表；
#define LOG3(...)  printf(__VA_ARGS__);

void logA(){
    printf("log func A \n");
}
 
void logB(){
    printf("log func B\n");
}

static void test_define1(void){

    TEST_START_INFO;

    TEST_LINE_REPORT_START;

    int score = 96;
    LOG1(score);
    LOG1(86);

    TEST_END_INFO;
}

static void test_define2(void){
    TEST_START_INFO;
    LOG2(A);
    LOG2(B);
}

static void test_define3(void){
    TEST_START_INFO;
    LOG3("score is %d\n",96);
}

static void test_sprintf(void){
    TEST_START_INFO;

    char buf[1024] = { 0 };
 
    sprintf(buf,"this is a test\n");
    printf("%s", buf);
 
    // 可以正常输出汉字
    sprintf(buf,"如果有汉字会怎么样 : %d\n",17);
    printf("%s", buf);
 
    sprintf(buf,"this is a test-> age:%d name:%s\n",17, "zhangsan");
    printf("%s", buf);
 
    sprintf(buf,"another test for sprintf age:%d name:%s height:%f\n",17, "zhangsan",1.75);
    printf("%s", buf);

}

static void test_log_something(void){
    TEST_START_INFO;
    sc_set_log_level(SC_LOG_LEVEL_DEBUG);
    atexit(SDL_Quit);

    LOGI("测试提示消息");
    LOGE("test error information");

/**
 跟其他测试的输出在同一个文件中类似如下的格式：

--- stderr ---
INFO: 测试提示消息
ERROR: test error information
-------

*/

    TEST_END_INFO;
}

static void test_demo(void)
{

    // 示例，没有实际意义

    TEST_START_INFO;

    TEST_LINE_REPORT_START;

    TEST_END_INFO;

    // 显示下面的关于日志的宏用法
    LOGE(" this is jack test for error,ingore this message");

    // 下面的函数是不能打印出当前的函数名称的，只会打印下面的函数
    print_test_log();
}

int main(int argc, char *argv[]) {
    (void) argc;
    (void) argv;

    test_define1();
    test_define2();
    test_define3();
    test_sprintf();
    test_log_something();

    test_demo();

    return 0;
};